﻿/*
    Name:           Interpolaters
    Description:
                    This library provides the implementation
                    of various different interpolation techniques
    Date: 2014/02/07
    Version: 0.0.1
    Author: Dave Russell 
*/
Interpolaters = new function () {
        
    this.Lerp = function(v0,v1,t){
        return v0 + t * (v1 - v0);
    };

    this.Linear = function (v0, v1, t) {
        return v0 + (v1 - v0) * t;
    };

    this.Cosine = function (v0, v1, t) {
        var ft = t * Math.PI;
        var f = (1 - Math.cos(ft)) / 2;
        return v0 * (1 - f) + v1 * f;
    };

    this.Cubic = function (v0, v1, v2, v3, t) {

        var a0, a1, a2, a3, t2;

        t2 = t * t;

        a0 = v3 - v2 - v0 + v1;
        a1 = v0 - v1 - a0;
        a2 = v2 - v0;
        a3 = v1;

        return (a0 * t * t2 + a1 * t2 + a2 * t + a3);
    };

    this.CatmullRom = function (v0, v1, v2, v3, t) {
        var a0, a1, a2, a3, t2;

        t2 = t * t;

        a0 = -0.5 * v0 + 1.5 * v1 - 1.5 * v2 + 0.5 * v3;
        a1 = v0 - 2.5 * v1 + 2 * v2 - 0.5 * v3;
        a2 = -0.5 * v0 + 0.5 * v2;
        a3 = v1;

        return (a0 * t * t2 + a1 * t2 + a2 * t + a3);
    };

    this.Hermite = function (v0, v1, v2, v3, t, tension, bias) {
        var m0, m1, t2, t3;
        var a0, a1, a2, a3;

        t2 = t * t;
        t3 = t2 * t;
        m0 = (v1 - v0) * (1 + bias) * (1 - tension) / 2;
        m0 += (v2 - v1) * (1 - bias) * (1 - tension) / 2;
        m1 = (v2 - v1) * (1 + bias) * (1 - tension) / 2;
        m1 += (v3 - v2) * (1 - bias) * (1 - tension) / 2;
        a0 = 2 * t3 - 3 * t2 + 1;
        a1 = t3 - 2 * t2 + t;
        a2 = t3 - t2;
        a3 = -2 * t3 + 3 * t2;

        return (a0 * v1 + a1 * m0 + a2 * m1 + a3 * v2);
    };
};